package com.example.mybatis.support.replace.impl;

import com.example.mybatis.constant.MapperSqlType;
import com.example.mybatis.exception.MybatisException;
import com.example.mybatis.mapper.MapperMethod;
import com.example.mybatis.mapper.MapperSqlTemplate;
import com.example.mybatis.mapper.MapperSqlTemplateSon;
import com.example.mybatis.support.replace.ISqlReplace;
import com.example.mybatis.support.replace.SqlReplaceResult;
import com.github.houbb.heaven.util.common.ArgUtil;

import java.util.List;

/**
 * if条件的处理
 */
public class IncludeRefSqlReplace   implements ISqlReplace {
    @Override
    public SqlReplaceResult replace(SqlReplaceResult sqlReplaceResult) {
        MapperMethod mapperMethod =  sqlReplaceResult.mapperMethod();
        List<MapperSqlTemplate>  mapperSqlTemplates =  mapperMethod.getSqlItemList();
        List<MapperSqlTemplateSon> mapperSqlTemplateSonList =   mapperMethod.getRefClass().getSqlTemplateList();
        for (MapperSqlTemplate mapperSqlTemplate:mapperSqlTemplates){
          if (MapperSqlType.INCLUDE.equals(mapperSqlTemplate.getType())){
            String refSql =      getRefIdSql(mapperSqlTemplateSonList,mapperSqlTemplate.getRefId());
            mapperSqlTemplate.setSql(refSql);
            mapperSqlTemplate.setReadyForSql(true);
          }
        }
        return sqlReplaceResult;
    }

    /**
     * 获取引用的sql
     * @param mapperSqlTemplateSonList  sql模版列表
     * @param refId  引用的id标识
     * @return
     */
    private String getRefIdSql(List<MapperSqlTemplateSon> mapperSqlTemplateSonList, String refId) {
        ArgUtil.notEmpty(refId,"refId");
        for (MapperSqlTemplateSon mapperSqlTemplateSon:   mapperSqlTemplateSonList){
          String id =            mapperSqlTemplateSon.getId() ;
           if (refId.equals(id)){
               return  mapperSqlTemplateSon.getSql();
           }
        }
        throw new MybatisException("Not found sql template for refId: " + refId);
    }
}
